package com.foreknow.controller;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

/**
 * 什么是Servlet：就是一个服务器端的应用程序
 * 作用：
 * 1.可以读取客户端发送的所有数据
 * 2.查询http请求中包含的任何其它信息(获取请求参数)
 * 3.处理数据并生成结果
 * 4.还可以设置合适的http响应参数
 * 5.将响应的信息发送给客户端
 *
 * 1.要想创建一个Servlet，那么就一定要继承HttpServlet
 * 2.要重写doGet/doPost方法。
 *      这两个方法什么时候会调用：如果客户端向服务器端发送的请求是get请求，那么就会自动去调用Servlet中的doGet()方法
 *                           如果客户端向服务器端发送的请求是post请求，那么就会自动去调用Servlet中的doPost()方法
 * 3.方法的参数：
 *      关于请求的方法
 *          http1.1支持多种请求方式:常用的方式 get(查询)  post(添加)  put(修改)   delete(删除)
 *      HttpServletRequest req  接口 ：这个接口无需我们自己初始化，服务器(Web容器)会自动将它进行初始化.
 *          这个接口中会提供一些方法：例如  获取一些请求的参数
 *      HttpServletRequest接口的作用：
 *          1.提取客户端请求的信息
 *              比如说：提取表单信息  提取http的头信息  cookie信息
 *          2.修改字符编码
 *          3.在服务器端来保存数据
 *          4.转换资源(资源的跳转)  转发以及重定向
 *
 *
 *
 *
 *      HttpServletResponse resp 接口 ：这个接口无需我们自己初始化，服务器(Web容器)会自动将它进行初始化.
 *
 *      以上的参数大家可以从网络上下载JavaEE6的开发文档：javax.servlet.http
 *
 * Servlet的生命周期：就是一个对象从它被创建开始一直到这个对象被销毁掉。
 * 三个阶段：
 * 1.初始化阶段 init()
 * 2.响应客户端请求的阶段  service()
 * 3.销毁阶段 destroy()
 *
 *
 *  * JSP中的页面指令： page   include   taglib
 *  *
 *  * JSP中的动作标签：
 *  * <jsp:useBean id=""></jsp:useBean>
 *  * <jsp:setProperty name="" property=""></jsp:setProperty>
 *  * <jsp:getProperty name="" property=""/>
 *  *
 *  * JSP隐含对象:
 *  * request	HttpServletRequest类的实例-----------(常用)
 *  * response	HttpServletResponse类的实例
 *  * out	PrintWriter类的实例，用于把结果输出至网页上
 *  * session	HttpSession类的实例------------------(常用)
 *  * application	ServletContext类的实例，与应用上下文有关
 *  * config	ServletConfig类的实例
 *  * pageContext	PageContext类的实例，提供对JSP页面所有对象以及命名空间的访问
 *  * page	类似于Java类中的this关键字
 *  * Exception	Exception类的对象，代表发生错误的JSP页面中对应的异常对象
 *
 * 如果简化JSP页面    ：JSPL 标签库 EL表达式 来简化JSP页面
 * EL：他是jsp中一种简洁的数据访问语言 用于简化jsp的开发
 * 基本语法：${表达式}
 *
 * 1.可以使用EL表达式来访问作用域中的（request）对象   ${对象名}
 * 2.k可以使用EL表达式来访问Javabean对象中的属性 ${对象名.属性名}
 *              req.setAttribute(""admin.admin);  ${admin.username};
 * 3.可以用EL表达式来访问数组
 * <%
 *      String array = {"aaa","bbb"}  ${数组对象名[下标]}
 *      request.setAttribute("array","array")
 * %>
 *    获取：  ${array[0]}
 *
 * 4.k可以通过EL表达式中的一些隐式对象来访问指定作用域z中的对象 ${requestScope.对象名}
 *
 *
 *在web应用中如何处理乱码的问题
 * 1.需要在Servlet中设置请求和相应的编码格式
 *  * 2.在JSP头部声明，统一输出字符集编码
 * 3.设置数据库字符集
 *      String name = rs.getString("NAME");
 *      String username  = new String (name.getBytes("IOS-8859-1"),"UTF-8")
 *4.如果有需要h还可以设置f服务器的字符集 conf/server.xml文件
 *      <Connector port="8080" UREncoding = "UTF-8">
 *
 *
 *  Http协议：它是一种无状态的链接协议
 *  application:> session > request >page (默认)
 *  application :  保存直到服务器关闭
 *  session    :   保存直到浏览器关闭
 *  reques     ：  一次请求当中
 *  page       :  一个页面中
 */
public class FirstServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置服务器端向客户端响应的内容的类型(MIME)
        resp.setContentType("text/html;charset=utf-8");
        //要使用这个对象中的方法在页面中输出内容
        PrintWriter out = resp.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>这是一个servelt程序</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>这是一个测试程序servelt</h1>");
        out.println("客户端向服务端请求的方法:"+req.getMethod()+"<br>");
        out.println("获取请求的url:"+req.getRequestURL()+"<br>");
        out.println("获取请求的uri:"+req.getRequestURI()+"<br>");
        out.println("获取到当前项目的名称:"+req.getContextPath()+"<br>");
        out.println("获取到本地端口号:"+req.getLocalPort()+"<br>");
        out.println("获取到http协议名称:"+req.getProtocol()+"<br>");
        out.println(new Date()+"<br>");
        out.println("</html>");
        out.flush();
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    public void destroy() {
        System.out.println("destory......");
    }

    @Override
    public void init(ServletConfig config) throws ServletException {
        //ServletConfig:使用此对象中的方法可以获取web.xml中配制的初始化参数  getInitParameter只能获取到局部的初始化参数
         String pageSize = config.getInitParameter("pageSize");

        //如何获取到全局的初始化参数,一定要先调用ServletConfig的getServletContext()方法
//        String pageSize = config.getServletContext().getInitParameter("pageSize");
        System.out.println(Integer.parseInt(pageSize));
    }

    //    @Override
    //    public void init() throws ServletException {
    //        //只被调用一次init()方法
    //        System.out.println("init......");
    //    }
}
